package com.lbt.mybatis.plus.extend.annotation;


import com.lbt.mybatis.plus.extend.bean.DefaultGroup;
import com.lbt.mybatis.plus.extend.expression.SqlExpression;
import com.lbt.mybatis.plus.extend.field.DefaultFieldValueConverter;
import com.lbt.mybatis.plus.extend.field.DefaultFieldValueFormatter;
import com.lbt.mybatis.plus.extend.field.FieldValueConverter;
import com.lbt.mybatis.plus.extend.field.FieldValueFormatter;

import java.lang.annotation.*;

/**
 * @author ZhangJinyu
 */
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Where {

    /**
     * sql列<br>
     * 特殊说明:例如有字段a.id,我们要使用{@link #sqlTable()}设置表名或者表的别名,不要直接在此参数上直接写a.id
     */
    String sqlColumn();

    /**
     * 表
     *
     * @return 表名(别名)
     */
    String sqlTable() default "";

    /**
     * 表达 默认为 EQ
     */
    SqlExpression expression() default SqlExpression.EQ;

    /**
     * 作用于union位置,从0开始,如果是-1,则适用所有union部分,否则每个部分都要设置
     *
     * @return union下标
     */
    int unionIndex() default -1;

    /**
     * 值格式化
     *
     * @return 格式化类
     */
    Class<? extends FieldValueFormatter<?>> fieldValueFormatter() default DefaultFieldValueFormatter.class;

    /**
     * 字段转换
     *
     * @return FieldConverter
     */
    Class<? extends FieldValueConverter> filedValueConverter() default DefaultFieldValueConverter.class;

    /**
     * 分组
     *
     * @return 分组
     */
    Class<?>[] groups() default {DefaultGroup.class};

    /**
     * 结果包装
     * 解释: 在整体SQL中进行包装,如果开启了包装则unionIndex将失效
     *
     * @return 是和否
     */
    boolean resultWrap() default false;
}
